package com.hospital.hospitalserver.mapper;

import com.hospital.hospitalserver.entity.ExamOrderItemDTO;
import com.hospital.hospitalserver.entity.ExamOrderRequest;
import com.hospital.hospitalserver.entity.Vo.ExamOrderItemVO;
import com.hospital.hospitalserver.entity.Vo.ExamOrderVO;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;

import java.math.BigDecimal;
import java.util.List;

/**
 * 检查项目功能接口
 * */
@Mapper
public interface ExamOrderMapper {

    /**
     * 插入检查申请主表
     * @param request 检查申请信息
     * @return 插入条数
     */
    int insertExamOrder(ExamOrderRequest request);

    /**
     * 插入检查申请明细表
     * @param orderId 订单ID
     * @param items 检查项目列表
     * @return 插入条数
     */
    int insertExamOrderItems(@Param("orderId") Integer orderId,@Param("items") List<ExamOrderItemDTO> items);


    /**
     * 医生诊断记录中的检查项目
     * 根据就诊ID查询检查申请列表（修改为返回列表）
     * @param visitId 就诊记录ID
     * @return 检查申请信息列表
     */
    List<ExamOrderVO> selectExamOrderListByVisitId(@Param("visit_id") Integer visit_id);

    /**
     * 根据就诊ID查询检查申请（保持原有方法，用于特定场景）
     * @param visitId 就诊记录ID
     * @return 检查申请信息
     */
    ExamOrderVO selectExamOrderByVisitId(@Param("visitId") Integer visitId);

    /**
     * 根据订单ID查询检查申请
     * @param orderId 订单ID
     * @return 检查申请信息
     */
    ExamOrderRequest selectExamOrderById(@Param("orderId") Integer orderId);

    /**
     * 查询检查申请明细
     * @param orderId 订单ID
     * @return 检查项目列表
     */
    List<ExamOrderItemVO> selectExamOrderItems(@Param("orderId") Integer orderId);

    /**
     * 更新检查申请状态
     * @param orderId 订单ID
     * @param orderStatus 订单状态
     * @return 更新条数
     */
    int updateOrderStatus(@Param("orderId") Integer orderId, @Param("orderStatus") String orderStatus);

    /**
     * 删除检查申请
     * @param orderId 订单ID
     * @return 删除条数
     */
    int deleteExamOrder(@Param("orderId") Integer orderId);

    /**
     * 验证就诊记录是否存在
     * @param visitId 就诊记录ID
     * @return 存在条数
     */
    int checkVisitExists(@Param("visitId") Integer visitId);

    /**
     * 验证费用项目是否存在
     * @param feeItemId 费用项目ID
     * @return 存在条数
     */
    int checkFeeItemExists(@Param("feeItemId") Integer feeItemId);

    /**
     * 删除单个检查项目
     * @param itemId 项目ID
     * @return 删除条数
     */
    int deleteExamOrderItem(@Param("itemId") Integer itemId);

    /**
     * 获取订单项目数量
     * @param orderId 订单ID
     * @return 项目数量
     */
    int getOrderItemCount(@Param("orderId") Integer orderId);

    /**
     * 计算订单总金额
     * @param orderId 订单ID
     * @return 总金额
     */
    BigDecimal calculateOrderTotalFee(@Param("orderId") Integer orderId);

    /**
     * 更新订单总金额
     * @param orderId 订单ID
     * @param totalFee 总金额
     * @return 更新条数
     */
    int updateOrderTotalFee(@Param("orderId") Integer orderId, @Param("totalFee") BigDecimal totalFee);

    /**
     * 根据订单ID查询项目ID列表
     */
    List<Integer> selectExamItemIdsByOrderId(@Param("orderId") Integer orderId);

    /**
     * 更新检查项目的payment_id
     */
    int updateExamItemPaymentId(@Param("itemId") Integer itemId, @Param("paymentId") Integer paymentId);


    /**
     * 根据项目ID查询项目信息
     * @param itemId 项目ID
     * @return 检查项目信息
     */
    ExamOrderItemDTO selectExamOrderItemById(@Param("itemId") Integer itemId);

    /**
     * 根据有效的挂号凭证ID查询当前诊断记录相关的检查项目
     * */
    List<ExamOrderItemVO> getExamOrderItemListByVisit(@Param("visit_id") Integer visit_id);

    /**
     * 自助缴费功能3
     * 开具检查项目完成缴费更新信息
     * */
    Integer completeExamOrderPaymentByOrderId(@Param("orderId") Integer order_id);

    /**
     * 自助缴费功能3
     * 开具检查项目子项完成缴费更新
     * */
    Integer completeExamOrderItemsPaymentByOrderId(@Param("orderId") Integer order_id);
}
